package com.example.couponservice.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.couponservice.domain.dto.CouponDto;
import com.example.couponservice.domain.entity.Coupon;
import com.example.couponservice.domain.vo.couponOrderVo;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 优惠券数据访问接口
 * 继承BaseMapper获取基础CRUD操作，同时提供自定义优惠券业务查询
 *
 * @author czwa
 */
@Mapper
public interface CouponMapper extends BaseMapper<Coupon> {

    /**
     * 向用户添加优惠券记录
     * 执行插入操作到coupon_order表
     *
     * @param couponOrderVo 包含优惠券ID和用户ID的订单视图对象
     */
    @Insert("insert into coupon_order(coupon_id,user_id) values(#{couponId},#{userId})")
    void addCouponToUser(couponOrderVo couponOrderVo);

    /**
     * 检查用户是否已领取指定优惠券
     * 通过查询coupon_order表判断用户与优惠券的关联关系
     *
     * @param couponOrderVo 包含优惠券ID和用户ID的订单视图对象
     * @return 1表示已领取，0表示未领取
     */
    @Select("select count(id) from coupon_order where coupon_id=#{couponId} and user_id=#{userId}")
    int existUserToCoupon(couponOrderVo couponOrderVo);

    /**
     * 获取所有可用优惠券
     * 执行多表关联查询，筛选出符合条件的优惠券
     *
     * @param now 当前时间，用于判断优惠券有效期
     * @param currentId 当前用户ID，用于判断用户领取状态
     * @return 可用优惠券DTO列表，包含用户领取状态信息
     */
    @Select(
            "select c.id,c.name,c.value,c.min_amount,c.start_time,c.end_time,c.description,c.stock,c.status,co.status as used " +
                    "from coupon c left join coupon_order co on c.id=co.coupon_id and co.user_id=#{currentId} " +
                    "where c.start_time<=#{now} and c.end_time>=#{now} and c.stock>0 "
    )
    List<CouponDto> getAllCoupon(LocalDateTime now, Integer currentId);
}